# 作者:杨新远
# 2025年02月24日21时31分29秒
# 2273695640@qq.com
import re  # 导入正则表达式模块

# 使用 re.match 尝试从字符串的开头匹配模式 'wangdao'
result = re.match('wangdao', 'wangdao.cn')
if result:  # 如果匹配成功
    print(result.group())  # 输出匹配到的内容

# 使用 re.match 尝试从字符串的开头匹配任意‘一个’字符（. 表示任意字符）
ret = re.match(".", "M")
print(ret.group())  # 输出匹配到的内容（这里是 'M'）

# 使用 re.match 尝试从字符串的开头匹配模式 't.o'（t + 任意字符 + o）
ret = re.match("t.o", "too")
print(ret.group())  # 输出匹配到的内容（这里是 'too'）

# 使用 re.match 尝试从字符串的开头匹配模式 't.o'（t + 任意字符 + o）
ret = re.match("t.o", "two")
print(ret.group())  # 输出匹配到的内容（这里是 'two'）

print('-' * 50)

# 匹配大小写 h 或 H
ret = re.match("[hH]", "hello Python")  # 匹配小写 h
print(ret.group())  # 输出匹配到的内容（这里是 'h'）

ret = re.match("[hH]", "Hello Python")  # 匹配大写 H
print(ret.group())  # 输出匹配到的内容（这里是 'H'）

# 匹配以 h 或 H 开头，后面跟着 'ello Python' 的字符串
ret = re.match("[hH]ello Python", "Hello Python")
print(ret.group())  # 输出匹配到的内容（这里是 'Hello Python'）

print('-' * 50)

# 匹配 0 到 9 的数字，后面跟着 'Hello Python'
ret = re.match("[0-9]Hello Python", "7Hello Python")
print(ret.group())  # 输出匹配到的内容（这里是 '7Hello Python'）

# 匹配 0-3 或 5-9 的数字，后面跟着 'Hello Python'
ret = re.match("[0-35-9]Hello Python", "7Hello Python")
print(ret.group())  # 输出匹配到的内容（这里是 '7Hello Python'）

print('-' * 50)

# 使用 \d 匹配数字
print(f'使用\\d进行匹配')  # 打印提示信息
ret = re.match(r"嫦娥\d号", "嫦娥1号发射成功")  # 匹配 '嫦娥' + 一个数字 + '号'
print(ret.group())  # 输出匹配到的内容（这里是 '嫦娥1号'）

ret = re.match(r"嫦娥\d号", "嫦娥2号发射成功")  # 匹配 '嫦娥' + 一个数字 + '号'
print(ret.group())  # 输出匹配到的内容（这里是 '嫦娥2号'）

ret = re.match(r"嫦娥\d号", "嫦娥3号发射成功")  # 匹配 '嫦娥' + 一个数字 + '号'
print(ret.group())  # 输出匹配到的内容（这里是 '嫦娥3号'）
print('-' * 100)

# 匹配以大写字母开头，后跟0个或多个小写字母的字符串
ret = re.match("[A-Z][a-z]*", "M")  # 匹配 'M'
print(ret.group())  # 输出匹配到的内容（这里是 'M'）

ret = re.match("[A-Z][a-z]*", "MnnM")  # 匹配 'Mnn'（只匹配到第一个 Mnn）
print(ret.group())  # 输出匹配到的内容（这里是 'Mnn'）

ret = re.match("[A-Z][a-z]*", "Aabcdef")  # 匹配 'Aabcdef'
print(ret.group())  # 输出匹配到的内容（这里是 'Aabcdef'）

print('-' * 50)

# 匹配变量名是否合法
names = ["name1", "_name", "2_name", "__name__"]  # 测试变量名列表
for name in names:
    # 使用正则表达式匹配变量名
    # 规则：以字母或'下划线'开头，后跟零个或多个字母、数字或下划线
    ret = re.match(r'[a-zA-Z_]\w*', name)
    if ret:  # 如果匹配成功
        print(f'{ret.group()} 是合法的变量名')  # 输出合法的变量名
    else:
        print(f'{name} 不是合法的变量名')  # 输出不合法的变量名

print('-' * 50)

# 匹配 0-99 的数字
ret = re.match(r"[1-9]?[0-9]", "7")  # 匹配 0-99 的数字
print(ret.group())  # 输出匹配到的内容（这里是 '7'）

ret = re.match(r"[1-9]?\d", "33")  # 匹配 0-99 的数字
print(ret.group())  # 输出匹配到的内容（这里是 '33'）
# ?匹配前一个字符出现1次或者0次，即要么有1次，要么没有
ret = re.match(r"[1-9]?\d$", "9")  # 匹配 0-99 的数字，并确保字符串结束
if ret:  # 如果匹配成功
    print(ret.group())  # 输出匹配到的内容（这里是 '9'）
else:
    print('数字不合法')  # 输出不合法提示

# 匹配 {m}：匹配前一个字符 m 次
ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")  # 匹配前 6 个字符
print(ret.group())  # 输出匹配到的内容（这里是 '12a3g4'）

# 默认是贪婪模式：尽可能匹配更多的字符
ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")  # 匹配 8-20 个字符
print(ret.group())  # 输出匹配到的内容（这里是 '1ad12f23s34455ff66'）

print('-' * 50)

# 匹配邮箱地址
email_list = ["xiaoWang@163.com", "xiaoWang@1636com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]  # 测试邮箱列表
for email in email_list:
    # 使用正则表达式匹配邮箱地址
    # 规则：5-20 个字母数字下划线 + @163.com
    #\.因为.是能匹配任意字符，所以要加转义符
    ret = re.match(r'\w{5,20}@163\.com$', email)
    if ret:  # 如果匹配成功
        print(f'{email} 是合法的邮箱')  # 输出合法的邮箱
    else:
        print(f'{email} 不是合法的邮箱')  # 输出不合法的邮箱
